package cn.quevo.cube.provide.define.entity;

import cn.quevo.common.entity.DoEntity;
import cn.quevo.common.enums.ResultStatusEnum;
import cn.quevo.common.exception.CheckParamsException;
import cn.quevo.common.lang.BooleanUtils;
import cn.quevo.common.lang.ColumnConvertUtils;
import cn.quevo.common.lang.RegularUtils;
import cn.quevo.common.lang.StringUtils;
import lombok.*;
import org.beetl.sql.core.annotatoin.Table;

/**
 * 模型字段 实体BEAN
 *
 * @author July july_sky@foxmail.com
 * @version 1.0
 * @date 2018/12/11 14:51:05
 * @Copyright 湘豫（北京）科技有限公司版权所有.All Rights Reserved.
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
@Table(name = "cube_base_column")
public class CubeBaseColumn extends DoEntity {

    /** 字段类型ID */
    private Long columnTypeId;
    /** 字段类型编码 */
    private String typeCode;
    /** 字段标签 */
    private String columnLabel;
    /** 字段名称 */
    private String colName;
    /** 字段属性名称(小驼峰) */
    private String columnAttr;
    /** 是否必填 */
    private String requiredYn;
    /** 是否唯一 */
    private String uniqueYn;
    /** 是否支持搜索 */
    private String searchYn;
    /** 是否主键 */
    private String primaryKeyYn;
    /** 默认值 */
    private String defValue;
    /** 长度 */
    private Integer maxLength;
    /** 小数位数 */
    private Integer decimalNum;
    /** 最小值 */
    private Double minValue;
    /** 最大值 */
    private Double maxValue;
    /** 最小长度 */
    private Integer minLength;
    /** 系统字段 */
    private String systemYn;
    /** 是否启用:Y/N */
    private String enabledYn;
    /** 字段类型CD */
    private String columnTypeCd;
    /** 支持排序:Y/N */
    private String sortYn;
    /** 物理字段 */
    private String physicalYn;
    /** 字段描述 */
    private String intro;
    /** 排序号 */
    private Long sortNum;

    /**
    * 公共参数验证
    */
    protected void validate() {
        if(StringUtils.isBlank(this.getColumnLabel())){
            throw new CheckParamsException(6002, "字段标签不能为空");
        }
        if (this.getSortNum() != null && StringUtils.isBlank(this.getSortNum())) {
            throw new CheckParamsException(6004, "排序号错误");
        }
    }

    /**
    * 新增参数验证
    */
    public void validateCreate() {
        this.validate();
        if(StringUtils.isBlank(this.getColumnTypeId())){
            throw new CheckParamsException(6001, "字段类型不能为空");
        }
        if(StringUtils.isBlank(this.getColName()) || !RegularUtils.englishAndUnderline(this.getColName())){
            throw new CheckParamsException(6003, "字段名称不能为空且只能包含英文和下划线");
        }
        this.setColumnAttr(ColumnConvertUtils.smallHump(this.getColName(),false,false));
        this.setSystemYn(BooleanUtils.FALSE);
    }

    /**
    * 修改参数验证
    */
    public void validateUpdate() {
        if (StringUtils.isBlank(this.getId())) {
            throw new CheckParamsException(ResultStatusEnum.RECORD_UNSELECTED);
        }
        this.validate();
    }
}
